home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 2 / Amiga Tools 2.iso / tex / macros / source / packages / amslatex / classes / amsplain.bst < prev    next >
Text File  |  1995-03-15  |  27KB  |  1,242 lines

  1. %%% ====================================================================
  2. %%%  @BibTeX-style-file{
  3. %%%     filename        = "amsplain.bst",
  4. %%%     version         = "1.2",
  5. %%%     date            = "20-Jan-1995",
  6. %%%     time            = "09:33:33 EST",
  7. %%%     checksum        = "29816 1241 3733 26829",
  8. %%%     author          = "American Mathematical Society",
  9. %%%     address         = "American Mathematical Society,
  10. %%%                        Technical Support,
  11. %%%                        Electronic Products and Services,
  12. %%%                        P. O. Box 6248,
  13. %%%                        Providence, RI 02940,
  14. %%%                        USA",
  15. %%%     telephone       = "401-455-4080 or (in the USA and Canada)
  16. %%%                        800-321-4AMS (321-4267)",
  17. %%%     FAX             = "401-331-3842",
  18. %%%     email           = "tech-support@math.ams.org (Internet)",
  19. %%%     copyright       = "Copyright (C) 1995 American Mathematical Society,
  20. %%%                        all rights reserved.  Copying of this file is
  21. %%%                        authorized only if either:
  22. %%%                        (1) you make absolutely no changes to your copy,
  23. %%%                        including name; OR
  24. %%%                        (2) if you do make changes, you first rename it
  25. %%%                        to some other name.",
  26. %%%     supported       = "yes",
  27. %%%     keywords        = "bibtex, bibliography, amslatex, ams-latex",
  28. %%%     abstract        = "BibTeX bibliography style `amsplain' for BibTeX
  29. %%%                        versions 0.99a or later and LaTeX version 2e.
  30. %%%                        Produces alphabetic-label bibliography items in
  31. %%%                        a form typical for American Mathematical Society
  32. %%%                        publications.",
  33. %%%     docstring       = "The checksum field above contains a CRC-16
  34. %%%                        checksum as the first value, followed by the
  35. %%%                        equivalent of the standard UNIX wc (word
  36. %%%                        count) utility output of lines, words, and
  37. %%%                        characters.  This is produced by Robert
  38. %%%                        Solovay's checksum utility.",
  39. %%%  }
  40. %%% ====================================================================
  41.  
  42. % See the file btxbst.doc for extra documentation other than
  43. % what is included here.  And see btxhak.tex for a description
  44. % of the BibTeX language and how to use it.
  45.  
  46. % This defines the types of fields that can occur in a database entry
  47. % for this particular bibliography style.  Except for `language',
  48. % this is the standard list from plain.bst.
  49.  
  50. %% Types of entries currently allowed in a BibTeX file:
  51. %%
  52. %% ARTICLE -- An article from a journal or magazine.
  53. %%
  54. %% BOOK -- A book with an explicit publisher.
  55. %%
  56. %% BOOKLET -- A work that is printed and bound,
  57. %% but without a named publisher or sponsoring institution.
  58. %%
  59. %% CONFERENCE -- The same as INPROCEEDINGS,
  60. %% included for Scribe compatibility.
  61. %%
  62. %% INBOOK -- A part of a book,
  63. %% which may be a chapter (or section or whatever) and/or a range of pages.
  64. %%
  65. %% INCOLLECTION -- A part of a book having its own title.
  66. %%
  67. %% INPROCEEDINGS -- An article in a conference proceedings.
  68. %%
  69. %% MANUAL -- Technical documentation.
  70. %%
  71. %% MASTERSTHESIS -- A Master's thesis.
  72. %%
  73. %% MISC -- Use this type when nothing else fits.
  74. %%
  75. %% PHDTHESIS -- A PhD thesis.
  76. %%
  77. %% PROCEEDINGS -- The proceedings of a conference.
  78. %%
  79. %% TECHREPORT -- A report published by a school or other institution,
  80. %% usually numbered within a series.
  81. %%
  82. %% UNPUBLISHED -- A document having an author and title, but not formally
  83. %% published.
  84.  
  85. ENTRY
  86.   { address
  87.     author
  88.     booktitle
  89.     chapter
  90.     edition
  91.     editor
  92.     howpublished
  93.     institution
  94.     journal
  95.     key
  96.     language
  97.     month
  98.     note
  99.     number
  100.     organization
  101.     pages
  102.     publisher
  103.     school
  104.     series
  105.     title
  106.     type
  107.     volume
  108.     year
  109.   }
  110.   {}
  111.   { label extra.label }
  112.  
  113. % Removed after.sentence, after.block---not needed.
  114.  
  115. INTEGERS { output.state before.all mid.sentence }
  116.  
  117. FUNCTION {init.state.consts}
  118. { #0 'before.all :=
  119.   #1 'mid.sentence :=
  120. }
  121.  
  122. % Scratch variables:
  123.  
  124. STRINGS { s t }
  125.  
  126. % Utility functions
  127.  
  128. FUNCTION {shows}
  129. { duplicate$ "::::  `" swap$ * "'" * top$
  130. }
  131.  
  132. FUNCTION {showstack}
  133. {"STACK====================================================================="
  134. top$
  135. stack$
  136. "ENDSTACK=================================================================="
  137. top$
  138. }
  139.  
  140. FUNCTION {not}
  141. {   { #0 }
  142.     { #1 }
  143.   if$
  144. }
  145.  
  146. FUNCTION {and}
  147. {   'skip$
  148.     { pop$ #0 }
  149.   if$
  150. }
  151.  
  152. FUNCTION {or}
  153. {   { pop$ #1 }
  154.     'skip$
  155.   if$
  156. }
  157.  
  158. FUNCTION {field.or.null}
  159. { duplicate$ empty$
  160.     { pop$ "" }
  161.     'skip$
  162.   if$
  163. }
  164.  
  165. FUNCTION {emphasize}
  166. { duplicate$ empty$
  167.     { pop$ "" }
  168.     { "\emph{" swap$ * "}" * }
  169.   if$
  170. }
  171.  
  172. % n.dashify is used to make sure page ranges get the TeX code
  173. % (two hyphens) for en-dashes.
  174.  
  175. FUNCTION {n.dashify}
  176. { 't :=
  177.   ""
  178.     { t empty$ not }
  179.     { t #1 #1 substring$ "-" =
  180.     { t #1 #2 substring$ "--" = not
  181.         { "--" *
  182.           t #2 global.max$ substring$ 't :=
  183.         }
  184.         {   { t #1 #1 substring$ "-" = }
  185.         { "-" *
  186.           t #2 global.max$ substring$ 't :=
  187.         }
  188.           while$
  189.         }
  190.       if$
  191.     }
  192.     { t #1 #1 substring$ *
  193.       t #2 global.max$ substring$ 't :=
  194.     }
  195.       if$
  196.     }
  197.   while$
  198. }
  199.  
  200. % tie.or.space.connect connects two items with a ~ if the
  201. % second item is less than 3 letters long, otherwise it just puts an
  202. % ordinary space.
  203.  
  204. FUNCTION {tie.or.space.connect}
  205. { duplicate$ text.length$ #3 <
  206.     { "~" }
  207.     { " " }
  208.   if$
  209.   swap$ * *
  210. }
  211.  
  212. FUNCTION {add.space.if.necessary}
  213. { duplicate$ "" =
  214.     'skip$
  215.     { " " * }
  216.   if$
  217. }
  218.  
  219. % either.or.check gives a warning if two mutually exclusive fields
  220. % were used in the database.
  221.  
  222. FUNCTION {either.or.check}
  223. { empty$
  224.     'pop$
  225.     { "can't use both " swap$ * " fields in " * cite$ * warning$ }
  226.   if$
  227. }
  228.  
  229. % output.nonnull is called by output.
  230.  
  231. FUNCTION {output.nonnull}
  232. % remove the top item from the stack because it's in the way.
  233. { 's :=
  234.   output.state mid.sentence =
  235. % If we're in mid-sentence, add a comma to the new top item and write it
  236.     { ", " * write$ }
  237. % Otherwise, if we're at the beginning of a bibitem,
  238.     { output.state before.all =
  239. % just write out the top item from the stack;
  240.       'write$
  241. % and the last alternative is that we're at the end of the current
  242. % bibitem, so we add a period to the top stack item and write it out.
  243.         { add.period$ " " * write$ }
  244.       if$
  245.       mid.sentence 'output.state :=
  246.     }
  247.   if$
  248. % Put the top item back on the stack that we removed earlier.
  249.   s
  250. }
  251.  
  252. % Output checks to see if the stack top is empty; if not, it
  253. % calls output.nonnull to write it out.
  254.  
  255. FUNCTION {output}
  256. { duplicate$ empty$
  257.     'pop$
  258.     'output.nonnull
  259.   if$
  260. }
  261.  
  262. % Standard warning message for a missing or empty field. For the user
  263. % we call any such field `missing' without respect to the distinction
  264. % made by BibTeX between missing and empty.
  265.  
  266. FUNCTION {missing.warning}
  267. { "missing " swap$ * " in " * cite$ * warning$ }
  268.  
  269. % Output.check is like output except that it gives a warning on-screen
  270. % if the given field in the database entry is empty.  t is the field
  271. % name.
  272.  
  273. FUNCTION {output.check}
  274. { 't :=
  275.   duplicate$ empty$
  276.     { pop$ t missing.warning }
  277.     'output.nonnull
  278.   if$
  279. }
  280.  
  281. FUNCTION {output.bibitem}
  282. { newline$
  283.   "\bibitem{" write$
  284.   cite$ write$
  285.   "}" write$
  286.   newline$
  287. % This empty string is the first thing that will be written
  288. % the next time write$ is called.  Done this way because each
  289. % item is saved on the stack until we find out what punctuation
  290. % should be added after it.  Therefore we need an empty first item.
  291.   ""
  292.   before.all 'output.state :=
  293. }
  294.  
  295. FUNCTION {fin.entry}
  296. { add.period$
  297.   write$
  298.   newline$
  299. }
  300.  
  301. % Removed new.block, new.block.checka, new.block.checkb, new.sentence,
  302. % new.sentence.checka, and new.sentence.checkb functions here, since they
  303. % don't seem to be needed in the AMS style.  Also moved some real
  304. % basic functions like `and' and 'or' earlier in the file.
  305.  
  306. INTEGERS { nameptr namesleft numnames }
  307.  
  308. % The extra section to write out a language field was added
  309. % for AMSPLAIN.BST.  Not present in plain.bst.
  310.  
  311. FUNCTION {format.language}
  312. { language empty$
  313.     { "" }
  314.     { " (" language * ")" * }
  315.   if$
  316. }
  317.  
  318. % This version of format.names puts names in the format
  319. %
  320. % First von Last, Jr.
  321. %
  322. % (i.e., first name first, no abbreviating to initials).
  323.  
  324. FUNCTION {format.names}
  325. { 's :=
  326.   #1 'nameptr :=
  327.   s num.names$ 'numnames :=
  328.   numnames 'namesleft :=
  329.     { namesleft #0 > }
  330.     { s nameptr "{ff~}{vv~}{ll}{, jj}" format.name$ 't :=
  331.       nameptr #1 >
  332.     { namesleft #1 >
  333.         { ", " * t * }
  334.         { numnames #2 >
  335.         { "," * }
  336.         'skip$
  337.           if$
  338.           t "others" =
  339.         { " et~al." * }
  340.         { " and " * t * }
  341.           if$
  342.         }
  343.       if$
  344.     }
  345.     't
  346.       if$
  347.       nameptr #1 + 'nameptr :=
  348.       namesleft #1 - 'namesleft :=
  349.     }
  350.   while$
  351. }
  352.  
  353. FUNCTION {format.authors}
  354. { author empty$
  355.     { "" }
  356.     { extra.label "\bysame" =
  357.          {"\bysame"}
  358.          { author format.names }
  359.      if$
  360.     }
  361.   if$
  362. }
  363.  
  364. FUNCTION {format.editors}
  365. { editor empty$
  366.     { "" }
  367.     { editor format.names
  368.       editor num.names$ #1 >
  369.     { " (eds.)" * }
  370.     { " (ed.)" * }
  371.       if$
  372.     }
  373.   if$
  374. }
  375.  
  376. FUNCTION {format.nonauthor.editors}
  377. { editor empty$
  378.     { "" }
  379.     { editor format.names
  380.       editor num.names$ #1 >
  381.     { ", eds." * }
  382.     { ", ed." * }
  383.       if$
  384.     }
  385.   if$
  386. }
  387.  
  388. FUNCTION {format.title}
  389. { title empty$
  390.     { "" }
  391.     { title "t" change.case$ emphasize }
  392.   if$
  393. }
  394.  
  395. FUNCTION {format.journal.vol.year}
  396. { journal empty$
  397.     { "journal name" missing.warning ""}
  398.     { journal }
  399.   if$
  400.   volume empty$
  401.     'skip$
  402.     { " \textbf{" * volume * "}" * }
  403.   if$
  404.   year empty$
  405.     { "year" missing.warning }
  406.     { " (" * year * ")" * }
  407.   if$
  408. }
  409.  
  410. % For formatting the issue number for a journal article.
  411.  
  412. FUNCTION {format.number}
  413. { number empty$
  414.     { "" }
  415.     { "no.~" number * }
  416.   if$
  417. }
  418.  
  419. % For formatting miscellaneous dates
  420.  
  421. FUNCTION {format.date}
  422. { year empty$
  423.     { month empty$
  424.     { "" }
  425.     { "there's a month but no year in " cite$ * warning$
  426.       month
  427.     }
  428.       if$
  429.     }
  430.     { month empty$
  431.     'year
  432.     { month " " * year * }
  433.       if$
  434.     }
  435.   if$
  436. }
  437.  
  438. %%      The volume, series and number information is sort of tricky.
  439. %%      This code handles it as follows:
  440. %%      If the series is present, and the volume, but not the number,
  441. %%        then we do "\emph{Book title}, Series Name, vol. 000"
  442. %%      If the series is present, and the number, but not the volume,
  443. %%        then we do "\emph{Book title}, Series Name, no. 000"
  444. %%      If the series is present, and both number and volume,
  445. %%        then we do "\emph{Book title}, vol. XX, Series Name, no. 000"
  446. %%      Finally, if the series is absent,
  447. %%        then we do "\emph{Book title}, vol. XX"
  448. %%        or         "\emph{Book title}, no. 000"
  449. %%        and if both volume and number are present, give a warning message.
  450.  
  451. FUNCTION {format.bookvolume.series.number}
  452. { volume empty$
  453.     { "" % Push the empty string as a placeholder in case everything else
  454.          % is empty too.
  455.       series empty$
  456.         'skip$
  457.         { pop$ series } % if series is not empty put in stack
  458.       if$
  459.       number empty$
  460.         'skip$
  461.         { duplicate$ empty$ % if no preceding material,
  462.             'skip$          % do nothing, otherwise
  463.             { ", " * }      % add a comma and space to separate.
  464.           if$
  465.           "no." number tie.or.space.connect * % add the number information
  466.         }
  467.       if$
  468.     }
  469. %% If the volume is NOT EMPTY:
  470.     { "vol." volume tie.or.space.connect % vol. XX
  471.       number empty$
  472.         { series empty$
  473.             'skip$
  474.             { series ", " * swap$ *}    % Series Name, vol. XX
  475.           if$
  476.         }
  477.         { series empty$
  478.             { "can't use both volume and number if series info is missing"
  479.               warning$
  480.               "in BibTeX entry type `" type$ * "'" * top$
  481.             }
  482.             { ", " * series * ", no." * number tie.or.space.connect }
  483.           if$
  484.         }
  485.       if$
  486.     }
  487.   if$
  488.  
  489. }  % end of format.bookvolume.series.number
  490.  
  491. %% format.inproc.title.where.editors is used by inproceedings entry types
  492.  
  493. FUNCTION {format.inproc.title.address.editors}
  494. { booktitle empty$
  495.     { "" }
  496. %%      No case changing or emphasizing for the title.  We want initial
  497. %%      caps, roman.
  498.     { booktitle }
  499.   if$
  500. %%      We add parentheses around the address (place where conference
  501. %%      was held).
  502.   address empty$
  503.     'skip$
  504.     { add.space.if.necessary "(" * address * ")" * }
  505.   if$
  506. %%      Likewise we add parentheses around the editors' names.
  507.   editor empty$
  508.     'skip$
  509.     { add.space.if.necessary "(" * format.nonauthor.editors * ")" * }
  510.   if$
  511. }
  512.  
  513. %% format.incoll.title.editors is similar to format.inproc... but
  514. %% omits the address. For collections that are not proceedings volumes.
  515.  
  516. FUNCTION {format.incoll.title.editors}
  517. { booktitle empty$
  518.     { "" }
  519. %%      No case changing or emphasizing for the title.  We want initial
  520. %%      caps, roman.
  521.     { booktitle }
  522.   if$
  523. %%      We add parentheses around the editors' names.
  524.   editor empty$
  525.     'skip$
  526.     { add.space.if.necessary "(" * format.nonauthor.editors * ")" * }
  527.   if$
  528. }
  529.  
  530. % Desired output for format.number.series:
  531. %
  532. % Lecture Notes in Math., no.~1224
  533.  
  534. FUNCTION {format.number.series}
  535. { series empty$
  536.     { number empty$
  537.         { "" }
  538.         { "there's a number but no series in " cite$ * warning$ }
  539.       if$
  540.     }
  541.     { series
  542.       number empty$
  543.         'skip$
  544.         { ", no.~" * number * }
  545.       if$
  546.     }
  547.   if$
  548. }
  549.  
  550. FUNCTION {format.edition}
  551. { edition empty$
  552.     { "" }
  553.     { output.state mid.sentence =
  554.     { edition "l" change.case$ " ed." * }
  555.     { edition "t" change.case$ " ed." * }
  556.       if$
  557.     }
  558.   if$
  559. }
  560.  
  561. INTEGERS { multiresult }
  562.  
  563. FUNCTION {multi.page.check}
  564. { 't :=
  565.   #0 'multiresult :=
  566.     { multiresult not
  567.       t empty$ not
  568.       and
  569.     }
  570.     { t #1 #1 substring$
  571.       duplicate$ "-" =
  572.       swap$ duplicate$ "," =
  573.       swap$ "+" =
  574.       or or
  575.     { #1 'multiresult := }
  576.     { t #2 global.max$ substring$ 't := }
  577.       if$
  578.     }
  579.   while$
  580.   multiresult
  581. }
  582.  
  583. FUNCTION {format.pages}
  584. { pages empty$
  585.     { "" }
  586.     { pages n.dashify }
  587.   if$
  588. }
  589.  
  590. FUNCTION {format.book.pages}
  591. { pages empty$
  592.     { "" }
  593.     { pages multi.page.check
  594.     { "pp.~" pages n.dashify * }
  595.     { "p.~" pages * }
  596.       if$
  597.     }
  598.   if$
  599. }
  600.  
  601. FUNCTION {format.chapter.pages}
  602. { chapter empty$
  603.     'format.pages
  604.     { type empty$
  605.     { "ch.~" }
  606.     { type "l" change.case$ " " * }
  607.       if$
  608.       chapter *
  609.       pages empty$
  610.     'skip$
  611.     { ", " * format.book.pages * }
  612.       if$
  613.     }
  614.   if$
  615. }
  616.  
  617. FUNCTION {empty.misc.check}
  618. { author empty$ title empty$ howpublished empty$
  619.   month empty$ year empty$ note empty$
  620.   and and and and and
  621.   key empty$ not and
  622.     { "all relevant fields are empty in " cite$ * warning$ }
  623.     'skip$
  624.   if$
  625. }
  626.  
  627. FUNCTION {format.thesis.type}
  628. { type empty$
  629.     'skip$
  630.     { pop$
  631.       type "t" change.case$
  632.     }
  633.   if$
  634. }
  635.  
  636. FUNCTION {format.tr.number}
  637. { type empty$
  638.     { "Tech. Report" }
  639.     'type
  640.   if$
  641.   number empty$
  642.     { "t" change.case$ }
  643.     { number tie.or.space.connect }
  644.   if$
  645. }
  646.  
  647. % The format.crossref functions haven't been paid much attention
  648. % at the present time (June 1990) and could probably use some
  649. % work.  MJD
  650.  
  651. FUNCTION {format.article.crossref}
  652. { key empty$
  653.     { journal empty$
  654.     { "need key or journal for " cite$ * " to crossref " * crossref *
  655.       warning$
  656.       ""
  657.     }
  658.     { "In " journal * }
  659.       if$
  660.     }
  661.     { "In " key * }
  662.   if$
  663.   " \cite{" * crossref * "}" *
  664. }
  665.  
  666. FUNCTION {format.crossref.editor}
  667. { editor #1 "{vv~}{ll}" format.name$
  668.   editor num.names$ duplicate$
  669.   #2 >
  670.     { pop$ " et~al." * }
  671.     { #2 <
  672.     'skip$
  673.     { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
  674.         { " et~al." * }
  675.         { " and " * editor #2 "{vv~}{ll}" format.name$ * }
  676.       if$
  677.     }
  678.       if$
  679.     }
  680.   if$
  681. }
  682.  
  683. FUNCTION {format.book.crossref}
  684. { volume empty$
  685.     { "empty volume in " cite$ * "'s crossref of " * crossref * warning$
  686.       "In "
  687.     }
  688.     { "Vol." volume tie.or.space.connect
  689.       " of " *
  690.     }
  691.   if$
  692.   editor empty$
  693.   editor field.or.null author field.or.null =
  694.   or
  695.     { key empty$
  696.     { series empty$
  697.         { "need editor, key, or series for " cite$ * " to crossref " *
  698.           crossref * warning$
  699.           "" *
  700.         }
  701.         { series * }
  702.       if$
  703.     }
  704.     { key * }
  705.       if$
  706.     }
  707.     { format.crossref.editor * }
  708.   if$
  709.   " \cite{" * crossref * "}" *
  710. }
  711.  
  712. FUNCTION {format.incoll.inproc.crossref}
  713. { editor empty$
  714.   editor field.or.null author field.or.null =
  715.   or
  716.     { key empty$
  717.     { booktitle empty$
  718.         { "need editor, key, or booktitle for " cite$ * " to crossref " *
  719.           crossref * warning$
  720.           ""
  721.         }
  722.         { "In \emph{" booktitle * "}" * }
  723.       if$
  724.     }
  725.     { "In " key * }
  726.       if$
  727.     }
  728.     { "In " format.crossref.editor * }
  729.   if$
  730.   " \cite{" * crossref * "}" *
  731. }
  732.  
  733. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  734.  
  735. % The main functions for each entry type.
  736.  
  737. % journal, vol and year are formatted together because they are
  738. % not separated by commas.
  739.  
  740. FUNCTION {article}
  741. { output.bibitem
  742.   format.authors "author" output.check
  743.   format.title "title" output.check
  744.   crossref missing$
  745.     { format.journal.vol.year output
  746.       format.number output
  747.       format.pages "pages" output.check
  748.     }
  749.     { format.article.crossref output.nonnull
  750.       format.pages output
  751.     }
  752.   if$
  753.   format.language *
  754.   note output
  755.   fin.entry
  756. }
  757.  
  758. FUNCTION {book}
  759. { output.bibitem
  760.   author empty$
  761.     { format.editors "author and editor" output.check }
  762.     { format.authors output.nonnull
  763.       crossref missing$
  764.     { "author and editor" editor either.or.check }
  765.     'skip$
  766.       if$
  767.     }
  768.   if$
  769.   format.title "title" output.check
  770.   format.edition output
  771.   crossref missing$
  772.     { format.bookvolume.series.number output
  773.       publisher "publisher" output.check
  774.       address output
  775.     }
  776.     { format.book.crossref output.nonnull
  777.     }
  778.   if$
  779.   format.date "year" output.check
  780.   format.language *
  781.   note output
  782.   fin.entry
  783. }
  784.  
  785. FUNCTION {booklet}
  786. { output.bibitem
  787.   format.authors output
  788.   format.title "title" output.check
  789.   howpublished output
  790.   address output
  791.   format.date output
  792.   note output
  793.   fin.entry
  794. }
  795.  
  796. FUNCTION {inbook}
  797. { output.bibitem
  798.   author empty$
  799.     { format.editors "author and editor" output.check }
  800.     { format.authors output.nonnull
  801.       crossref missing$
  802.     { "author and editor" editor either.or.check }
  803.     'skip$
  804.       if$
  805.     }
  806.   if$
  807.   title "title" output.check
  808.   crossref missing$
  809.     { format.bookvolume.series.number output
  810.       format.chapter.pages "chapter and pages" output.check
  811.       format.number.series output
  812.       publisher "publisher" output.check
  813.       address output
  814.     }
  815.     { format.chapter.pages "chapter and pages" output.check
  816.       format.book.crossref output.nonnull
  817.     }
  818.   if$
  819.   format.edition output
  820.   format.date "year" output.check
  821.   format.book.pages output
  822.   format.language *
  823.   note output
  824.   fin.entry
  825. }
  826.  
  827. FUNCTION {incollection}
  828. { output.bibitem
  829.   format.authors "author" output.check
  830.   format.title "title" output.check
  831.   crossref missing$
  832.     { format.incoll.title.editors "booktitle" output.check
  833.       format.bookvolume.series.number output
  834.       publisher "publisher" output.check
  835.       address output
  836.       format.edition output
  837.       format.date "year" output.check
  838.     }
  839.     { format.incoll.inproc.crossref output.nonnull
  840.     }
  841.   if$
  842.   note output
  843.   format.book.pages output
  844.   format.language *
  845.   fin.entry
  846. }
  847.  
  848. FUNCTION {inproceedings}
  849. { output.bibitem
  850.   format.authors "author" output.check
  851.   format.title "title" output.check
  852.   crossref missing$
  853.     { format.inproc.title.address.editors "booktitle" output.check
  854.       format.bookvolume.series.number output
  855.       organization output
  856.       publisher output
  857.       format.date "year" output.check
  858.     }
  859.     { format.incoll.inproc.crossref output.nonnull
  860.     }
  861.   if$
  862.   note output
  863.   format.book.pages output
  864.   format.language *
  865.   fin.entry
  866. }
  867.  
  868. FUNCTION {conference} { inproceedings }
  869.  
  870. FUNCTION {manual}
  871. { output.bibitem
  872.   author empty$
  873.     { organization empty$
  874.     'skip$
  875.     { organization output.nonnull
  876.       address output
  877.     }
  878.       if$
  879.     }
  880.     { format.authors output.nonnull }
  881.   if$
  882.   format.title "title" output.check
  883.   author empty$
  884.     { organization empty$
  885.     { address output }
  886.     'skip$
  887.       if$
  888.     }
  889.     { organization output
  890.       address output
  891.     }
  892.   if$
  893.   format.edition output
  894.   format.date output
  895.   note output
  896.   fin.entry
  897. }
  898.  
  899. FUNCTION {mastersthesis}
  900. { output.bibitem
  901.   format.authors "author" output.check
  902.   format.title "title" output.check
  903.   "Master's thesis" format.thesis.type output.nonnull
  904.   school "school" output.check
  905.   address output
  906.   format.date "year" output.check
  907.   note output
  908.   fin.entry
  909. }
  910.  
  911. FUNCTION {misc}
  912. { output.bibitem
  913.   format.authors output
  914.   format.title output
  915.   howpublished output
  916.   format.date output
  917.   note output
  918.   format.book.pages output
  919.   fin.entry
  920.   empty.misc.check
  921. }
  922.  
  923. FUNCTION {phdthesis}
  924. { output.bibitem
  925.   format.authors "author" output.check
  926.   format.title "title" output.check
  927.   "Ph.D. thesis" format.thesis.type output.nonnull
  928.   school "school" output.check
  929.   address output
  930.   format.date "year" output.check
  931.   note output
  932.   format.book.pages output
  933.   fin.entry
  934. }
  935.  
  936. FUNCTION {proceedings}
  937. { output.bibitem
  938.   editor empty$
  939.     { organization output }
  940.     { format.editors output.nonnull }
  941.   if$
  942.   format.title "title" output.check
  943.   format.bookvolume.series.number output
  944.   address empty$
  945.     { editor empty$
  946.         'skip$
  947.     { organization output }
  948.       if$
  949.       publisher output
  950.       format.date "year" output.check
  951.     }
  952.     { address output.nonnull
  953.       editor empty$
  954.     'skip$
  955.     { organization output }
  956.       if$
  957.       publisher output
  958.       format.date "year" output.check
  959.     }
  960.   if$
  961.   note output
  962.   fin.entry
  963. }
  964.  
  965. FUNCTION {techreport}
  966. { output.bibitem
  967.   format.authors "author" output.check
  968.   format.title "title" output.check
  969.   format.tr.number output.nonnull
  970.   institution "institution" output.check
  971.   address output
  972.   format.date "year" output.check
  973.   note output
  974.   fin.entry
  975. }
  976.  
  977. FUNCTION {unpublished}
  978. { output.bibitem
  979.   format.authors "author" output.check
  980.   format.title "title" output.check
  981.   note "note" output.check
  982.   format.date output
  983.   fin.entry
  984. }
  985.  
  986. FUNCTION {default.type} { misc }
  987.  
  988. MACRO {jan} {"January"}
  989.  
  990. MACRO {feb} {"February"}
  991.  
  992. MACRO {mar} {"March"}
  993.  
  994. MACRO {apr} {"April"}
  995.  
  996. MACRO {may} {"May"}
  997.  
  998. MACRO {jun} {"June"}
  999.  
  1000. MACRO {jul} {"July"}
  1001.  
  1002. MACRO {aug} {"August"}
  1003.  
  1004. MACRO {sep} {"September"}
  1005.  
  1006. MACRO {oct} {"October"}
  1007.  
  1008. MACRO {nov} {"November"}
  1009.  
  1010. MACRO {dec} {"December"}
  1011.  
  1012. READ
  1013.  
  1014. FUNCTION {sortify}
  1015. { purify$
  1016.   "l" change.case$
  1017. }
  1018.  
  1019. INTEGERS { len }
  1020.  
  1021. FUNCTION {chop.word}
  1022. { 's :=
  1023.   'len :=
  1024.   s #1 len substring$ =
  1025.     { s len #1 + global.max$ substring$ }
  1026.     's
  1027.   if$
  1028. }
  1029.  
  1030. FUNCTION {sort.format.names}
  1031. { 's :=
  1032.   #1 'nameptr :=
  1033.   ""
  1034.   s num.names$ 'numnames :=
  1035.   numnames 'namesleft :=
  1036.     { namesleft #0 > }
  1037.     { nameptr #1 >
  1038.     { "   " * }
  1039.     'skip$
  1040.       if$
  1041.       s nameptr "{vv{ } }{ll{ }}{  ff{ }}{  jj{ }}" format.name$ 't :=
  1042.       nameptr numnames = t "others" = and
  1043.     { "et al" * }
  1044.     { t sortify * }
  1045.       if$
  1046.       nameptr #1 + 'nameptr :=
  1047.       namesleft #1 - 'namesleft :=
  1048.     }
  1049.   while$
  1050. }
  1051.  
  1052. FUNCTION {sort.format.title}
  1053. { 't :=
  1054.   "A " #2
  1055.     "An " #3
  1056.       "The " #4 t chop.word
  1057.     chop.word
  1058.   chop.word
  1059.   sortify
  1060.   #1 global.max$ substring$
  1061. }
  1062.  
  1063. FUNCTION {author.sort}
  1064. { author empty$
  1065.     { key empty$
  1066.     { "to sort, need author or key in " cite$ * warning$
  1067.       ""
  1068.     }
  1069.     { key sortify }
  1070.       if$
  1071.     }
  1072.     { author sort.format.names }
  1073.   if$
  1074. }
  1075.  
  1076. FUNCTION {author.editor.sort}
  1077. { author empty$
  1078.     { editor empty$
  1079.     { key empty$
  1080.         { "to sort, need author, editor, or key in " cite$ * warning$
  1081.           ""
  1082.         }
  1083.         { key sortify }
  1084.       if$
  1085.     }
  1086.     { editor sort.format.names }
  1087.       if$
  1088.     }
  1089.     { author sort.format.names }
  1090.   if$
  1091. }
  1092.  
  1093. FUNCTION {author.organization.sort}
  1094. { author empty$
  1095.     { organization empty$
  1096.     { key empty$
  1097.         { "to sort, need author, organization, or key in " cite$ * warning$
  1098.           ""
  1099.         }
  1100.         { key sortify }
  1101.       if$
  1102.     }
  1103.     { "The " #4 organization chop.word sortify }
  1104.       if$
  1105.     }
  1106.     { author sort.format.names }
  1107.   if$
  1108. }
  1109.  
  1110. FUNCTION {editor.organization.sort}
  1111. { editor empty$
  1112.     { organization empty$
  1113.     { key empty$
  1114.         { "to sort, need editor, organization, or key in " cite$ * warning$
  1115.           ""
  1116.         }
  1117.         { key sortify }
  1118.       if$
  1119.     }
  1120.     { "The " #4 organization chop.word sortify }
  1121.       if$
  1122.     }
  1123.     { editor sort.format.names }
  1124.   if$
  1125. }
  1126.  
  1127. FUNCTION {presort}
  1128. { type$ "book" =
  1129.   type$ "inbook" =
  1130.   or
  1131.     'author.editor.sort
  1132.     { type$ "proceedings" =
  1133.     'editor.organization.sort
  1134.     { type$ "manual" =
  1135.         'author.organization.sort
  1136.         'author.sort
  1137.       if$
  1138.     }
  1139.       if$
  1140.     }
  1141.   if$
  1142.   "    "
  1143.   *
  1144.   year field.or.null sortify
  1145.   *
  1146.   "    "
  1147.   *
  1148.   title field.or.null
  1149.   sort.format.title
  1150.   *
  1151.   #1 entry.max$ substring$
  1152.   'sort.key$ :=
  1153. }
  1154.  
  1155. ITERATE {presort}
  1156.  
  1157. SORT
  1158.  
  1159. STRINGS { longest.label prev.author this.author }
  1160.  
  1161. INTEGERS { number.label longest.label.width }
  1162.  
  1163. FUNCTION {initialize.longest.label}
  1164. { "" 'longest.label :=
  1165.   #1 'number.label :=
  1166.   #0 'longest.label.width :=
  1167.   "abcxyz" 'prev.author :=
  1168.   "" 'this.author :=
  1169. }
  1170.  
  1171. FUNCTION {longest.label.pass}
  1172. { number.label int.to.str$ 'label :=
  1173.   number.label #1 + 'number.label :=
  1174.   label width$ longest.label.width >
  1175.     { label 'longest.label :=
  1176.       label width$ 'longest.label.width :=
  1177.     }
  1178.     'skip$
  1179.   if$
  1180.   author empty$
  1181.     { editor empty$
  1182.       { "" }
  1183.       'editor
  1184.       if$
  1185.     }
  1186.     'author
  1187.   if$
  1188.   'this.author :=
  1189.   this.author prev.author =
  1190.     { "\bysame" 'extra.label := }
  1191.     { "" 'extra.label :=
  1192.       this.author "" =
  1193.         { "abcxyz" }
  1194.         'this.author
  1195.       if$
  1196.       'prev.author :=
  1197.     }
  1198.   if$
  1199. }
  1200.  
  1201. EXECUTE {initialize.longest.label}
  1202.  
  1203. ITERATE {longest.label.pass}
  1204.  
  1205. FUNCTION {begin.bib}
  1206. { preamble$ empty$
  1207.     'skip$
  1208.     { preamble$ write$ newline$ }
  1209.   if$
  1210.   "\providecommand{\bysame}{\leavevmode\hbox to3em{\hrulefill}\thinspace}"
  1211.        write$ newline$
  1212.   "\begin{thebibliography}{"  longest.label  * "}" * write$ newline$
  1213. }
  1214.  
  1215. EXECUTE {begin.bib}
  1216.  
  1217. EXECUTE {init.state.consts}
  1218.  
  1219. ITERATE {call.type$}
  1220.  
  1221. FUNCTION {end.bib}
  1222. { newline$
  1223.   "\end{thebibliography}" write$ newline$
  1224. }
  1225.  
  1226. EXECUTE {end.bib}
  1227. %% \CharacterTable
  1228. %%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
  1229. %%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
  1230. %%   Digits        \0\1\2\3\4\5\6\7\8\9
  1231. %%   Exclamation   \!     Double quote  \"     Hash (number) \#
  1232. %%   Dollar        \$     Percent       \%     Ampersand     \&
  1233. %%   Acute accent  \'     Left paren    \(     Right paren   \)
  1234. %%   Asterisk      \*     Plus          \+     Comma         \,
  1235. %%   Minus         \-     Point         \.     Solidus       \/
  1236. %%   Colon         \:     Semicolon     \;     Less than     \<
  1237. %%   Equals        \=     Greater than  \>     Question mark \?
  1238. %%   Commercial at \@     Left bracket  \[     Backslash     \\
  1239. %%   Right bracket \]     Circumflex    \^     Underscore    \_
  1240. %%   Grave accent  \`     Left brace    \{     Vertical bar  \|
  1241. %%   Right brace   \}     Tilde         \~}
  1242.